import Firebase from 'firebase'
import LRU from 'lru-cache'

/**
 * Creates an API instance.
 * @param {Object} options - The options for creating the API.
 * @param {Object} options.config - The configuration object for Firebase.
 * @param {string} options.version - The version of the API.
 * @returns {Object} - The API instance.
 */
export function createAPI ({ config, version }) {
  // 在服务端运行起来的时候，这个函数只会执行一次
  // 重新创建store的时候，这个函数不会执行
  // 所以下面缓存的api.cachedIds确实有用，切换到其它页面的时候，如果走服务端
  // 那么能立马获得数据（因为在切换页面的时候数据已经加载了）
  console.log('createAPI')
  let api
  // this piece of code may run multiple times in development mode,
  // so we attach the instantiated API to `process` to avoid duplications
  if (process.__API__) {
    api = process.__API__
  } else {
    // 这两句代码就是创建标准api实例的流程，建立最基本的和Firebase服务的通
    // 客户端只有这两句代码，没有后续的两层预设缓存
    Firebase.initializeApp(config)
    api = process.__API__ = Firebase.database().ref(version)

    api.onServer = true

    // fetched item cache
    api.cachedItems = LRU({
      max: 1000,
      maxAge: 1000 * 60 * 15 // 15 min cache
    })

    // cache the latest story ids
    api.cachedIds = {}
    // 服务端持续监听这各个type类型列表数据的变化，一旦有变化，立马更新缓存的数据
    // 下次有新请求到服务端，加载的组件需要异步拉取数据时，直接可以从api.cachedIds中取
    ;['top', 'new', 'show', 'ask', 'job'].forEach(type => {
      api.child(`${type}stories`).on('value', snapshot => {
        api.cachedIds[type] = snapshot.val()
      })
    })
  }
  return api
}
